all files / fc-er/ Action.js

71.2% Statements 89/125
48.84% Branches 42/86
78.26% Functions 18/23
73.4% Lines 69/94
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 20712×     2604×   560×                                         12262×   12262×   12262× 12262× 12262× 12262×               12262×   12262×   12262×   12262×     12262×     12262×   12262×   12262× 12262×         12262× 12262× 12262×                           12262× 12262× 12262×               12262×       12262×   12262× 12262×     12262× 12262×   12262× 12262×     12262×   12262× 12262×         12262×   12262×   12262×           12262×         12262×                     10830×       10830×   10830×   10830× 10830× 10830×   10830×     10830× 10830× 10830×   10830×     10830×   10830×                                                    
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
 
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
function _possibleConstructorReturn(self, call) { Iif (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
 
function _inherits(subClass, superClass) { Iif (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
 
Iif (typeof define !== 'function') {
    var define = require('amdefine')(module);
}
 
define(function (require) {
    'use strict';
 
    var util = require('./util');
    var EventTarget = require('fc-mini-event/EventTarget');
    var canUseDOM = require('./ExecutionEnvironment').canUseDOM;
 
    var reportErrors = function reportErrors() {
        var errors = [];
        for (var i = 0; i < arguments.length; i++) {
            var result = arguments[i];
            if (!result.success) {
                errors.push(result);
            }
        }
 
        return this.handleError(errors);
    };
 
    var Action = function (_EventTarget) {
        _inherits(Action, _EventTarget);
 
        function Action() {
            _classCallCheck(this, Action);
 
            var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Action).call(this));
 
            _this.disposed = false;
            _this.context = null;
            _this.initialize();
            return _this;
        }
 
        _createClass(Action, [{
            key: 'initialize',
            value: function initialize() {}
        }, {
            key: 'enter',
            value: function enter(actionContext) {
                this.context = actionContext || {};
 
                this.fire('enter');
 
                var args = util.mix({}, actionContext && actionContext.args);
 
                Iif (this.model) {
                    this.model.fill(args);
                } else {
                    this.model = this.createModel(args);
                }
 
                this.model && this.model.setContext && this.model.setContext(actionContext);
 
                this.fire('beforemodelload');
 
                var isModelRehydrated = false;
                Iif (actionContext && actionContext.rehydratedModel && this.model && this.model.rehydrate) {
                    this.model.rehydrate(actionContext.rehydratedModel);
                    isModelRehydrated = true;
                }
 
                Eif (this.model && typeof this.model.load === 'function' && !isModelRehydrated) {
                    var loadingModel = this.model.load();
                    return loadingModel.then(util.bind(this.forwardToView, this), util.bind(reportErrors, this));
                } else {
                    this.forwardToView();
                    return Promise.resolve(this);
                }
            }
        }, {
            key: 'handleError',
            value: function handleError(errors) {
                throw errors;
            }
        }, {
            key: 'createModel',
            value: function createModel(args) {
                Eif (this.modelType) {
                    var model = new this.modelType(args);
                    return model;
                } else {
                    return {};
                }
            }
        }, {
            key: 'forwardToView',
            value: function forwardToView() {
                Iif (this.disposed) {
                    return this;
                }
 
                this.fire('modelloaded');
 
                Eif (!this.view) {
                    this.view = this.createView();
                }
 
                Eif (this.view) {
                    this.view.model = this.model;
                    // 如果创建View的时候已经设置了`container`,就不要强行干扰了
                    Eif (!this.view.container) {
                        this.view.container = this.context.container;
                    }
 
                    this.fire('beforerender');
 
                    Eif (canUseDOM) {
                        this.view.render();
                    } else {
                        this.view.renderToString();
                    }
 
                    this.fire('rendered');
 
                    this.initBehavior();
 
                    this.fire('entercomplete');
                } else {
                    var eventBus = this.context.erContext.getEventBus();
                    eventBus.notifyError('No view attached to this action');
                }
 
                return this;
            }
        }, {
            key: 'createView',
            value: function createView() {
                return this.viewType ? new this.viewType() : null;
            }
        }, {
            key: 'initBehavior',
            value: function initBehavior() {}
        }, {
            key: 'filterRedirect',
            value: function filterRedirect() {}
        }, {
            key: 'leave',
            value: function leave() {
                Iif (this.disposed) {
                    return this;
                }
 
                this.disposed = true;
 
                this.fire('beforeleave');
 
                Eif (this.model) {
                    Eif (typeof this.model.dispose === 'function') {
                        this.model.dispose();
                    }
                    this.model = null;
                }
 
                Eif (this.view) {
                    Eif (typeof this.view.dispose === 'function') {
                        this.view.dispose();
                    }
                    this.view = null;
                }
 
                this.fire('leave');
 
                this.destroyEvents();
            }
        }, {
            key: 'redirect',
            value: function redirect(url, options) {
                var locator = this.context.erContext.getLocator();
                locator.redirect(url, options);
            }
        }, {
            key: 'reload',
            value: function reload() {
                var locator = this.context.erContext.getLocator();
                locator.reload();
            }
        }, {
            key: 'back',
            value: function back(defaultURL) {
                var referrer = this.context && this.context.referrer;
                var url = referrer || defaultURL;
                if (url) {
                    this.redirect(url);
                }
            }
        }]);
 
        return Action;
    }(EventTarget);
 
    return Action;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9BY3Rpb24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLElBQUksT0FBTyxNQUFQLEtBQWtCLFVBQWxCLEVBQThCO0FBQUMsUUFBSSxTQUFTLFFBQVEsVUFBUixFQUFvQixNQUFwQixDQUFULENBQUw7Q0FBbEM7O0FBRUEsT0FBTyxVQUFVLE9BQVYsRUFBbUI7QUFDdEIsaUJBRHNCOztBQUd0QixRQUFNLE9BQU8sUUFBUSxRQUFSLENBQVAsQ0FIZ0I7QUFJdEIsUUFBTSxjQUFjLFFBQVEsMkJBQVIsQ0FBZCxDQUpnQjtBQUt0QixRQUFNLFlBQVksUUFBUSx3QkFBUixFQUFrQyxTQUFsQyxDQUxJOztBQU90QixRQUFNLGVBQWUsU0FBZixZQUFlLEdBQVk7QUFDN0IsWUFBTSxTQUFTLEVBQVQsQ0FEdUI7QUFFN0IsYUFBSyxJQUFJLElBQUksQ0FBSixFQUFPLElBQUksVUFBVSxNQUFWLEVBQWtCLEdBQXRDLEVBQTJDO0FBQ3ZDLGdCQUFNLFNBQVMsVUFBVSxDQUFWLENBQVQsQ0FEaUM7QUFFdkMsZ0JBQUksQ0FBQyxPQUFPLE9BQVAsRUFBZ0I7QUFDakIsdUJBQU8sSUFBUCxDQUFZLE1BQVosRUFEaUI7YUFBckI7U0FGSjs7QUFPQSxlQUFPLEtBQUssV0FBTCxDQUFpQixNQUFqQixDQUFQLENBVDZCO0tBQVosQ0FQQzs7UUFtQmhCOzs7QUFDRiwwQkFBZTs7Ozs7QUFHWCxrQkFBSyxRQUFMLEdBQWdCLEtBQWhCLENBSFc7QUFJWCxrQkFBSyxPQUFMLEdBQWUsSUFBZixDQUpXO0FBS1gsa0JBQUssVUFBTCxHQUxXOztTQUFmOzs7O3lDQVFjOzs7a0NBRVAsZUFBZTtBQUNsQixxQkFBSyxPQUFMLEdBQWUsaUJBQWlCLEVBQWpCLENBREc7O0FBR2xCLHFCQUFLLElBQUwsQ0FBVSxPQUFWLEVBSGtCOztBQUtsQixvQkFBTSxPQUFPLEtBQUssR0FBTCxDQUFTLEVBQVQsRUFBYSxpQkFBaUIsY0FBYyxJQUFkLENBQXJDLENBTFk7O0FBT2xCLG9CQUFJLEtBQUssS0FBTCxFQUFZO0FBQ1oseUJBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsSUFBaEIsRUFEWTtpQkFBaEIsTUFHSztBQUNELHlCQUFLLEtBQUwsR0FBYSxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBYixDQURDO2lCQUhMOztBQU9BLHFCQUFLLEtBQUwsSUFBYyxLQUFLLEtBQUwsQ0FBVyxVQUFYLElBQXlCLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsYUFBdEIsQ0FBdkMsQ0Fka0I7O0FBZ0JsQixxQkFBSyxJQUFMLENBQVUsaUJBQVYsRUFoQmtCOztBQWtCbEIsb0JBQUksb0JBQW9CLEtBQXBCLENBbEJjO0FBbUJsQixvQkFBSSxhQUFDLElBQWlCLGNBQWMsZUFBZCxJQUFrQyxLQUFLLEtBQUwsSUFBYyxLQUFLLEtBQUwsQ0FBVyxTQUFYLEVBQXNCO0FBQ3hGLHlCQUFLLEtBQUwsQ0FBVyxTQUFYLENBQXFCLGNBQWMsZUFBZCxDQUFyQixDQUR3RjtBQUV4Rix3Q0FBb0IsSUFBcEIsQ0FGd0Y7aUJBQTVGOztBQUtBLG9CQUFJLEtBQUssS0FBTCxJQUFjLE9BQU8sS0FBSyxLQUFMLENBQVcsSUFBWCxLQUFvQixVQUEzQixJQUNYLENBQUMsaUJBQUQsRUFBb0I7QUFDdkIsd0JBQU0sZUFBZSxLQUFLLEtBQUwsQ0FBVyxJQUFYLEVBQWYsQ0FEaUI7QUFFdkIsMkJBQU8sYUFBYSxJQUFiLENBQ0gsS0FBSyxJQUFMLENBQVUsS0FBSyxhQUFMLEVBQW9CLElBQTlCLENBREcsRUFFSCxLQUFLLElBQUwsQ0FBVSxZQUFWLEVBQXdCLElBQXhCLENBRkcsQ0FBUCxDQUZ1QjtpQkFEM0IsTUFRSztBQUNELHlCQUFLLGFBQUwsR0FEQztBQUVELDJCQUFPLFFBQVEsT0FBUixDQUFnQixJQUFoQixDQUFQLENBRkM7aUJBUkw7Ozs7d0NBY1MsUUFBUTtBQUNqQixzQkFBTSxNQUFOLENBRGlCOzs7O3dDQUlSLE1BQU07QUFDZixvQkFBSSxLQUFLLFNBQUwsRUFBZ0I7QUFDaEIsd0JBQU0sUUFBUSxJQUFJLEtBQUssU0FBTCxDQUFlLElBQW5CLENBQVIsQ0FEVTtBQUVoQiwyQkFBTyxLQUFQLENBRmdCO2lCQUFwQixNQUlLO0FBQ0QsMkJBQU8sRUFBUCxDQURDO2lCQUpMOzs7OzRDQVNhO0FBQ2Isb0JBQUksS0FBSyxRQUFMLEVBQWU7QUFDZiwyQkFBTyxJQUFQLENBRGU7aUJBQW5COztBQUlBLHFCQUFLLElBQUwsQ0FBVSxhQUFWLEVBTGE7O0FBT2Isb0JBQUksQ0FBQyxLQUFLLElBQUwsRUFBVztBQUNaLHlCQUFLLElBQUwsR0FBWSxLQUFLLFVBQUwsRUFBWixDQURZO2lCQUFoQjs7QUFJQSxvQkFBSSxLQUFLLElBQUwsRUFBVztBQUNYLHlCQUFLLElBQUwsQ0FBVSxLQUFWLEdBQWtCLEtBQUssS0FBTDs7QUFEUCx3QkFHUCxDQUFDLEtBQUssSUFBTCxDQUFVLFNBQVYsRUFBcUI7QUFDdEIsNkJBQUssSUFBTCxDQUFVLFNBQVYsR0FBc0IsS0FBSyxPQUFMLENBQWEsU0FBYixDQURBO3FCQUExQjs7QUFJQSx5QkFBSyxJQUFMLENBQVUsY0FBVixFQVBXOztBQVNYLHdCQUFJLFNBQUosRUFBZTtBQUNYLDZCQUFLLElBQUwsQ0FBVSxNQUFWLEdBRFc7cUJBQWYsTUFHSztBQUNELDZCQUFLLElBQUwsQ0FBVSxjQUFWLEdBREM7cUJBSEw7O0FBT0EseUJBQUssSUFBTCxDQUFVLFVBQVYsRUFoQlc7O0FBa0JYLHlCQUFLLFlBQUwsR0FsQlc7O0FBb0JYLHlCQUFLLElBQUwsQ0FBVSxlQUFWLEVBcEJXO2lCQUFmLE1Bc0JLO0FBQ0Qsd0JBQU0sV0FBVyxLQUFLLE9BQUwsQ0FBYSxTQUFiLENBQXVCLFdBQXZCLEVBQVgsQ0FETDtBQUVELDZCQUFTLFdBQVQsQ0FBcUIsaUNBQXJCLEVBRkM7aUJBdEJMOztBQTJCQSx1QkFBTyxJQUFQLENBdENhOzs7O3lDQXlDSDtBQUNWLHVCQUFPLEtBQUssUUFBTCxHQUFnQixJQUFJLEtBQUssUUFBTCxFQUFwQixHQUFzQyxJQUF0QyxDQURHOzs7OzJDQUlFOzs7NkNBRUU7OztvQ0FFVDtBQUNMLG9CQUFJLEtBQUssUUFBTCxFQUFlO0FBQ2YsMkJBQU8sSUFBUCxDQURlO2lCQUFuQjs7QUFJQSxxQkFBSyxRQUFMLEdBQWdCLElBQWhCLENBTEs7O0FBT0wscUJBQUssSUFBTCxDQUFVLGFBQVYsRUFQSzs7QUFTTCxvQkFBSSxLQUFLLEtBQUwsRUFBWTtBQUNaLHdCQUFJLE9BQU8sS0FBSyxLQUFMLENBQVcsT0FBWCxLQUF1QixVQUE5QixFQUEwQztBQUMxQyw2QkFBSyxLQUFMLENBQVcsT0FBWCxHQUQwQztxQkFBOUM7QUFHQSx5QkFBSyxLQUFMLEdBQWEsSUFBYixDQUpZO2lCQUFoQjs7QUFPQSxvQkFBSSxLQUFLLElBQUwsRUFBVztBQUNYLHdCQUFJLE9BQU8sS0FBSyxJQUFMLENBQVUsT0FBVixLQUFzQixVQUE3QixFQUF5QztBQUN6Qyw2QkFBSyxJQUFMLENBQVUsT0FBVixHQUR5QztxQkFBN0M7QUFHQSx5QkFBSyxJQUFMLEdBQVksSUFBWixDQUpXO2lCQUFmOztBQU9BLHFCQUFLLElBQUwsQ0FBVSxPQUFWLEVBdkJLOztBQXlCTCxxQkFBSyxhQUFMLEdBekJLOzs7O3FDQTRCQyxLQUFLLFNBQVM7QUFDcEIsb0JBQU0sVUFBVSxLQUFLLE9BQUwsQ0FBYSxTQUFiLENBQXVCLFVBQXZCLEVBQVYsQ0FEYztBQUVwQix3QkFBUSxRQUFSLENBQWlCLEdBQWpCLEVBQXNCLE9BQXRCLEVBRm9COzs7O3FDQUtkO0FBQ04sb0JBQU0sVUFBVSxLQUFLLE9BQUwsQ0FBYSxTQUFiLENBQXVCLFVBQXZCLEVBQVYsQ0FEQTtBQUVOLHdCQUFRLE1BQVIsR0FGTTs7OztpQ0FLSixZQUFZO0FBQ2Qsb0JBQU0sV0FBVyxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxPQUFMLENBQWEsUUFBYixDQURuQjtBQUVkLG9CQUFNLE1BQU0sWUFBWSxVQUFaLENBRkU7QUFHZCxvQkFBSSxHQUFKLEVBQVM7QUFDTCx5QkFBSyxRQUFMLENBQWMsR0FBZCxFQURLO2lCQUFUOzs7OztNQXpKYSxhQW5CQzs7QUFrTHRCLFdBQU8sTUFBUCxDQWxMc0I7Q0FBbkIsQ0FBUCIsImZpbGUiOiJBY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge3ZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSl9XG5cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbiAgICBjb25zdCBFdmVudFRhcmdldCA9IHJlcXVpcmUoJ2ZjLW1pbmktZXZlbnQvRXZlbnRUYXJnZXQnKTtcbiAgICBjb25zdCBjYW5Vc2VET00gPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50JykuY2FuVXNlRE9NO1xuXG4gICAgY29uc3QgcmVwb3J0RXJyb3JzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3JzKTtcbiAgICB9O1xuXG4gICAgY2xhc3MgQWN0aW9uIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgICAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsaXplICgpIHt9XG5cbiAgICAgICAgZW50ZXIgKGFjdGlvbkNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGFjdGlvbkNvbnRleHQgfHwge307XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZW50ZXInKTtcblxuICAgICAgICAgICAgY29uc3QgYXJncyA9IHV0aWwubWl4KHt9LCBhY3Rpb25Db250ZXh0ICYmIGFjdGlvbkNvbnRleHQuYXJncyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5maWxsKGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3JlYXRlTW9kZWwoYXJncyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubW9kZWwgJiYgdGhpcy5tb2RlbC5zZXRDb250ZXh0ICYmIHRoaXMubW9kZWwuc2V0Q29udGV4dChhY3Rpb25Db250ZXh0KTtcblxuICAgICAgICAgICAgdGhpcy5maXJlKCdiZWZvcmVtb2RlbGxvYWQnKTtcblxuICAgICAgICAgICAgbGV0IGlzTW9kZWxSZWh5ZHJhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoKGFjdGlvbkNvbnRleHQgJiYgYWN0aW9uQ29udGV4dC5yZWh5ZHJhdGVkTW9kZWwpICYmIHRoaXMubW9kZWwgJiYgdGhpcy5tb2RlbC5yZWh5ZHJhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnJlaHlkcmF0ZShhY3Rpb25Db250ZXh0LnJlaHlkcmF0ZWRNb2RlbCk7XG4gICAgICAgICAgICAgICAgaXNNb2RlbFJlaHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbCAmJiB0eXBlb2YgdGhpcy5tb2RlbC5sb2FkID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgJiYgIWlzTW9kZWxSZWh5ZHJhdGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZ01vZGVsID0gdGhpcy5tb2RlbC5sb2FkKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRpbmdNb2RlbC50aGVuKFxuICAgICAgICAgICAgICAgICAgICB1dGlsLmJpbmQodGhpcy5mb3J3YXJkVG9WaWV3LCB0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5iaW5kKHJlcG9ydEVycm9ycywgdGhpcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3J3YXJkVG9WaWV3KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGhhbmRsZUVycm9yIChlcnJvcnMpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9ycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZU1vZGVsIChhcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyB0aGlzLm1vZGVsVHlwZShhcmdzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3J3YXJkVG9WaWV3ICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbW9kZWxsb2FkZWQnKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcgPSB0aGlzLmNyZWF0ZVZpZXcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMudmlldy5tb2RlbCA9IHRoaXMubW9kZWw7XG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5Yib5bu6Vmlld+eahOaXtuWAmeW3sue7j+iuvue9ruS6hmBjb250YWluZXJg77yM5bCx5LiN6KaB5by66KGM5bmy5omw5LqGXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXcuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5jb250YWluZXIgPSB0aGlzLmNvbnRleHQuY29udGFpbmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnYmVmb3JlcmVuZGVyJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FuVXNlRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZW5kZXJUb1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncmVuZGVyZWQnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEJlaGF2aW9yKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2VudGVyY29tcGxldGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50QnVzID0gdGhpcy5jb250ZXh0LmVyQ29udGV4dC5nZXRFdmVudEJ1cygpO1xuICAgICAgICAgICAgICAgIGV2ZW50QnVzLm5vdGlmeUVycm9yKCdObyB2aWV3IGF0dGFjaGVkIHRvIHRoaXMgYWN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlVmlldyAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3VHlwZSA/IG5ldyB0aGlzLnZpZXdUeXBlKCkgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5pdEJlaGF2aW9yICgpIHt9XG5cbiAgICAgICAgZmlsdGVyUmVkaXJlY3QgKCkge31cblxuICAgICAgICBsZWF2ZSAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5maXJlKCdiZWZvcmVsZWF2ZScpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5tb2RlbC5kaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudmlldykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy52aWV3LmRpc3Bvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maXJlKCdsZWF2ZScpO1xuXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lFdmVudHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZGlyZWN0ICh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0b3IgPSB0aGlzLmNvbnRleHQuZXJDb250ZXh0LmdldExvY2F0b3IoKTtcbiAgICAgICAgICAgIGxvY2F0b3IucmVkaXJlY3QodXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlbG9hZCAoKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5jb250ZXh0LmVyQ29udGV4dC5nZXRMb2NhdG9yKCk7XG4gICAgICAgICAgICBsb2NhdG9yLnJlbG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmFjayAoZGVmYXVsdFVSTCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZXIgPSB0aGlzLmNvbnRleHQgJiYgdGhpcy5jb250ZXh0LnJlZmVycmVyO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVmZXJyZXIgfHwgZGVmYXVsdFVSTDtcbiAgICAgICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0KHVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQWN0aW9uO1xufSk7XG4iXX0=